Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Commit 0802627ac90aefc059e03a45479d5ed700e40b86


Parents : 0330048
Author : Ivan <ivan@quad4.io>
Signature : Signature validation error
Date : 2026-04-13T20:56:42-05:00

feat(locales): add sticker management translations for German, English, Italian, and Russian, including export/import functionality and UI hints

Changes
Diff

diff --git a/meshchatx/src/frontend/locales/de.json b/meshchatx/src/frontend/locales/de.json
index 8a0b2326..7f5e5233 100644
--- a/meshchatx/src/frontend/locales/de.json
+++ b/meshchatx/src/frontend/locales/de.json
@@ -302,6 +302,31 @@
"copy": "Copy",
"copy_to_clipboard": "Copy to clipboard"
},
+ "stickers": {
+ "settings_title": "Sticker",
+ "settings_description": "Gespeicherte Bilder für diese Identität. Im Composer nutzen oder aus Chats speichern. JSON-Backup exportieren oder importieren.",
+ "export": "Sticker exportieren",
+ "import": "Sticker importieren",
+ "export_done": "Sticker exportiert",
+ "replace_duplicates": "Doppelte Bilder beim Import ersetzen",
+ "count": "{count} gespeicherte Sticker",
+ "open_picker": "Sticker",
+ "picker_tooltip": "Emoji und Sticker",
+ "tab_emojis": "Emojis",
+ "tab_stickers": "Sticker",
+ "empty_library": "Noch keine Sticker.",
+ "drop_or_click_hint": "Bilder hier ablegen oder klicken (PNG, JPEG, GIF, WebP, BMP, max. 512 KB pro Datei).",
+ "add_more_hint": "Weitere Sticker per Ablegen oder Klick hinzufügen.",
+ "file_too_large": "Jeder Sticker darf höchstens 512 KB groß sein.",
+ "unsupported_type": "Nur PNG, JPEG, GIF, WebP oder BMP.",
+ "uploaded_count": "{count} Sticker hinzugefügt.",
+ "save_to_library": "Bild zu Sticker speichern",
+ "saved": "Sticker gespeichert",
+ "duplicate": "Bereits in der Sammlung",
+ "save_failed": "Sticker konnte nicht gespeichert werden",
+ "import_success": "Importiert {imported}, übersprungen {skipped_duplicates} Duplikate, ungültig {skipped_invalid}",
+ "import_failed": "Sticker-Import fehlgeschlagen"
+ },
"maintenance": {
"title": "Wartung & Daten",
"description": "Verwalten Sie Ihre lokalen Daten, löschen Sie Caches und sichern Sie Konversationen.",
@@ -313,6 +338,9 @@
"clear_nomadnet_favs_desc": "Alle gespeicherten NomadNetwork-Knoten aus den Favoriten entfernen.",
"clear_lxmf_icons": "LXMF-Icons löschen",
"clear_lxmf_icons_desc": "Zwischengespeicherte LXMF-Benutzersymbole entfernen.",
+ "clear_stickers": "Alle Sticker löschen",
+ "clear_stickers_desc": "Alle gespeicherten Sticker-Bilder für diese Identität entfernen.",
+ "stickers_cleared": "Sticker gelöscht",
"clear_archives": "Seitenarchive löschen",
"clear_archives_desc": "Alle zwischengespeicherten NomadNetwork-Seiten löschen.",
"clear_reticulum_docs": "Reticulum-Dokumentation löschen",
@@ -430,6 +458,7 @@
"title": "Über",
"third_party_licenses": "Lizenzen Dritter",
"version": "v{version}",
+ "ui_build": "UI-Build {date}",
"rns_version": "RNS {version}",
"lxmf_version": "LXMF {version}",
"python_version": "Python {version}",
@@ -1201,7 +1230,20 @@
"listening_on": "Hört auf:",
"provide_allowed_hash": "Bitte geben Sie mindestens einen erlaubten Identitäts-Hash an!",
"failed_to_start_listener": "Starten des Listeners fehlgeschlagen",
- "failed_to_stop_listener": "Stoppen des Listeners fehlgeschlagen"
+ "failed_to_stop_listener": "Stoppen des Listeners fehlgeschlagen",
+ "browse_file": "Durchsuchen",
+ "browse_folder": "Ordner wählen",
+ "receive_folder": "Ordner für empfangene Dateien",
+ "open_folder": "Ordner öffnen",
+ "show_in_folder": "Im Ordner anzeigen",
+ "received_file": "Datei empfangen",
+ "receive_failed": "Empfang fehlgeschlagen",
+ "send_complete": "Senden abgeschlossen",
+ "fetch_complete": "Abruf abgeschlossen",
+ "transfer_status": "Status",
+ "listening_active_background": "Hören läuft im Hintergrund weiter. Kehren Sie hierher zurück, um zu verwalten oder zu stoppen.",
+ "web_path_hint": "Browser können keine vollständigen Dateipfade anzeigen. Nutzen Sie die Desktop-App zum Auswählen oder fügen Sie den vollständigen Pfad auf diesem Rechner ein.",
+ "web_save_path_prompt": "Geben Sie den absoluten Ordnerpfad auf dem Rechner mit MeshChat (Server) ein, in dem die abgerufene Datei gespeichert werden soll:"
},
"rnprobe": {
"network_diagnostics": "Netzwerkdiagnose",

diff --git a/meshchatx/src/frontend/locales/en.json b/meshchatx/src/frontend/locales/en.json
index 1efa5f4e..0d071cac 100644
--- a/meshchatx/src/frontend/locales/en.json
+++ b/meshchatx/src/frontend/locales/en.json
@@ -302,6 +302,31 @@
"loading": "Loading...",
"ok": "OK"
},
+ "stickers": {
+ "settings_title": "Stickers",
+ "settings_description": "Saved images for this identity. Use them from the message composer or save images from chats. Export or import a JSON backup.",
+ "export": "Export stickers",
+ "import": "Import stickers",
+ "export_done": "Stickers exported",
+ "replace_duplicates": "Replace duplicate images when importing",
+ "count": "{count} saved sticker(s)",
+ "open_picker": "Stickers",
+ "picker_tooltip": "Emoji and stickers",
+ "tab_emojis": "Emojis",
+ "tab_stickers": "Stickers",
+ "empty_library": "No stickers yet.",
+ "drop_or_click_hint": "Drop images here or click to browse (PNG, JPEG, GIF, WebP, BMP, max 512 KB each).",
+ "add_more_hint": "Drop or click to add more stickers.",
+ "file_too_large": "Each sticker must be 512 KB or smaller.",
+ "unsupported_type": "Use PNG, JPEG, GIF, WebP, or BMP.",
+ "uploaded_count": "Added {count} sticker(s).",
+ "save_to_library": "Save image to stickers",
+ "saved": "Sticker saved",
+ "duplicate": "Already in your library",
+ "save_failed": "Could not save sticker",
+ "import_success": "Imported {imported}, skipped {skipped_duplicates} duplicates, invalid {skipped_invalid}",
+ "import_failed": "Failed to import stickers"
+ },
"maintenance": {
"title": "Maintenance & Data",
"description": "Manage your local data, clear caches, and backup conversations.",
@@ -313,6 +338,9 @@
"clear_nomadnet_favs_desc": "Remove all saved NomadNetwork nodes from your favorites.",
"clear_lxmf_icons": "Clear LXMF Icons",
"clear_lxmf_icons_desc": "Remove cached LXMF user icons from your device.",
+ "clear_stickers": "Clear All Stickers",
+ "clear_stickers_desc": "Remove every saved sticker image for this identity.",
+ "stickers_cleared": "Stickers cleared",
"clear_archives": "Clear Page Archives",
"clear_archives_desc": "Delete all cached NomadNetwork pages.",
"clear_reticulum_docs": "Clear Reticulum Docs",
@@ -380,6 +408,7 @@
"title": "About",
"third_party_licenses": "Third-party licenses",
"version": "v{version}",
+ "ui_build": "UI build {date}",
"rns_version": "RNS {version}",
"lxmf_version": "LXMF {version}",
"python_version": "Python {version}",

diff --git a/meshchatx/src/frontend/locales/it.json b/meshchatx/src/frontend/locales/it.json
index cfe5607a..0098c4d5 100644
--- a/meshchatx/src/frontend/locales/it.json
+++ b/meshchatx/src/frontend/locales/it.json
@@ -302,6 +302,31 @@
"loading": "Caricamento...",
"ok": "OK"
},
+ "stickers": {
+ "settings_title": "Sticker",
+ "settings_description": "Immagini salvate per questa identità. Usale nel compositore o salva immagini dalle chat. Esporta o importa un backup JSON.",
+ "export": "Esporta sticker",
+ "import": "Importa sticker",
+ "export_done": "Sticker esportati",
+ "replace_duplicates": "Sostituisci immagini duplicate durante l'importazione",
+ "count": "{count} sticker salvati",
+ "open_picker": "Sticker",
+ "picker_tooltip": "Emoji e sticker",
+ "tab_emojis": "Emoji",
+ "tab_stickers": "Sticker",
+ "empty_library": "Nessuno sticker.",
+ "drop_or_click_hint": "Trascina immagini qui o clicca per sfogliare (PNG, JPEG, GIF, WebP, BMP, max 512 KB ciascuna).",
+ "add_more_hint": "Trascina o clicca per aggiungere altri sticker.",
+ "file_too_large": "Ogni sticker deve essere al massimo 512 KB.",
+ "unsupported_type": "Usa PNG, JPEG, GIF, WebP o BMP.",
+ "uploaded_count": "Aggiunti {count} sticker.",
+ "save_to_library": "Salva immagine negli sticker",
+ "saved": "Sticker salvato",
+ "duplicate": "Già nella raccolta",
+ "save_failed": "Impossibile salvare lo sticker",
+ "import_success": "Importati {imported}, saltati {skipped_duplicates} duplicati, non validi {skipped_invalid}",
+ "import_failed": "Importazione sticker non riuscita"
+ },
"maintenance": {
"title": "Manutenzione e Dati",
"description": "Gestisci i tuoi dati locali, svuota le cache e fai il backup delle conversazioni.",
@@ -313,6 +338,9 @@
"clear_nomadnet_favs_desc": "Rimuovi tutti i nodi NomadNetwork salvati dai tuoi preferiti.",
"clear_lxmf_icons": "Cancella Icone LXMF",
"clear_lxmf_icons_desc": "Rimuovi le icone utente LXMF memorizzate sul tuo dispositivo.",
+ "clear_stickers": "Cancella tutti gli sticker",
+ "clear_stickers_desc": "Rimuovi tutte le immagini sticker salvate per questa identità.",
+ "stickers_cleared": "Sticker cancellati",
"clear_archives": "Cancella Archivi Pagine",
"clear_archives_desc": "Elimina tutte le pagine NomadNetwork memorizzate.",
"clear_reticulum_docs": "Cancella Documentazione Reticulum",
@@ -430,6 +458,7 @@
"title": "Informazioni",
"third_party_licenses": "Licenze di terze parti",
"version": "v{version}",
+ "ui_build": "Build interfaccia {date}",
"rns_version": "RNS {version}",
"lxmf_version": "LXMF {version}",
"python_version": "Python {version}",
@@ -1305,7 +1334,20 @@
"listening_on": "In ascolto su:",
"provide_allowed_hash": "Fornisci almeno un hash di identità consentito!",
"failed_to_start_listener": "Impossibile avviare il listener",
- "failed_to_stop_listener": "Impossibile fermare il listener"
+ "failed_to_stop_listener": "Impossibile fermare il listener",
+ "browse_file": "Sfoglia",
+ "browse_folder": "Scegli cartella",
+ "receive_folder": "Cartella file ricevuti",
+ "open_folder": "Apri cartella",
+ "show_in_folder": "Mostra nella cartella",
+ "received_file": "File ricevuto",
+ "receive_failed": "Ricezione non riuscita",
+ "send_complete": "Invio completato",
+ "fetch_complete": "Recupero completato",
+ "transfer_status": "Stato",
+ "listening_active_background": "L'ascolto continua in background. Torna qui per gestire o interrompere.",
+ "web_path_hint": "I browser non possono esporre percorsi completi. Usa l'app desktop per sfogliare o incolla il percorso completo su questa macchina.",
+ "web_save_path_prompt": "Inserisci il percorso assoluto della cartella sulla macchina che esegue MeshChat (server) dove salvare il file recuperato:"
},
"rnprobe": {
"network_diagnostics": "Diagnostica di Rete",

diff --git a/meshchatx/src/frontend/locales/ru.json b/meshchatx/src/frontend/locales/ru.json
index f3380f47..53626db8 100644
--- a/meshchatx/src/frontend/locales/ru.json
+++ b/meshchatx/src/frontend/locales/ru.json
@@ -302,6 +302,31 @@
"copy": "Copy",
"copy_to_clipboard": "Copy to clipboard"
},
+ "stickers": {
+ "settings_title": "Стикеры",
+ "settings_description": "Сохранённые изображения для этой личности. Используйте в поле ввода или сохраняйте из чатов. Экспорт и импорт JSON.",
+ "export": "Экспорт стикеров",
+ "import": "Импорт стикеров",
+ "export_done": "Стикеры экспортированы",
+ "replace_duplicates": "Заменять дубликаты при импорте",
+ "count": "Сохранено стикеров: {count}",
+ "open_picker": "Стикеры",
+ "picker_tooltip": "Эмодзи и стикеры",
+ "tab_emojis": "Эмодзи",
+ "tab_stickers": "Стикеры",
+ "empty_library": "Пока нет стикеров.",
+ "drop_or_click_hint": "Перетащите сюда изображения или нажмите для выбора (PNG, JPEG, GIF, WebP, BMP, до 512 КБ каждое).",
+ "add_more_hint": "Перетащите или нажмите, чтобы добавить ещё.",
+ "file_too_large": "Каждый стикер не больше 512 КБ.",
+ "unsupported_type": "Допустимы PNG, JPEG, GIF, WebP или BMP.",
+ "uploaded_count": "Добавлено стикеров: {count}.",
+ "save_to_library": "Сохранить в стикеры",
+ "saved": "Стикер сохранён",
+ "duplicate": "Уже в коллекции",
+ "save_failed": "Не удалось сохранить стикер",
+ "import_success": "Импортировано {imported}, пропущено дубликатов {skipped_duplicates}, неверных {skipped_invalid}",
+ "import_failed": "Не удалось импортировать стикеры"
+ },
"maintenance": {
"title": "Обслуживание и данные",
"description": "Управляйте локальными данными, очищайте кэши и создавайте резервные копии разговоров.",
@@ -313,6 +338,9 @@
"clear_nomadnet_favs_desc": "Удалить все сохраненные узлы NomadNetwork из избранного.",
"clear_lxmf_icons": "Очистить LXMF-иконки",
"clear_lxmf_icons_desc": "Удалить кэшированные LXMF-иконки пользователей с устройства.",
+ "clear_stickers": "Очистить все стикеры",
+ "clear_stickers_desc": "Удалить все сохранённые стикеры для этой личности.",
+ "stickers_cleared": "Стикеры очищены",
"clear_archives": "Очистить архивы страниц",
"clear_archives_desc": "Удалить все кэшированные страницы NomadNetwork.",
"clear_reticulum_docs": "Очистить документацию Reticulum",
@@ -430,6 +458,7 @@
"title": "О программе",
"third_party_licenses": "Лицензии сторонних компонентов",
"version": "v{version}",
+ "ui_build": "Сборка UI {date}",
"rns_version": "RNS {version}",
"lxmf_version": "LXMF {version}",
"python_version": "Python {version}",
@@ -1201,7 +1230,20 @@
"listening_on": "Прослушивание на:",
"provide_allowed_hash": "Пожалуйста, укажите хотя бы один разрешенный хеш идентичности!",
"failed_to_start_listener": "Не удалось запустить прослушиватель",
- "failed_to_stop_listener": "Не удалось остановить прослушиватель"
+ "failed_to_stop_listener": "Не удалось остановить прослушиватель",
+ "browse_file": "Обзор",
+ "browse_folder": "Выбрать папку",
+ "receive_folder": "Папка для полученных файлов",
+ "open_folder": "Открыть папку",
+ "show_in_folder": "Показать в папке",
+ "received_file": "Файл получен",
+ "receive_failed": "Ошибка приёма",
+ "send_complete": "Отправка завершена",
+ "fetch_complete": "Получение завершено",
+ "transfer_status": "Статус",
+ "listening_active_background": "Прослушивание продолжается в фоне. Вернитесь сюда для управления или остановки.",
+ "web_path_hint": "Браузеры не показывают полные пути к файлам. Используйте настольное приложение для выбора или вставьте полный путь на этой машине.",
+ "web_save_path_prompt": "Введите абсолютный путь к папке на машине с MeshChat (сервер), куда сохранить полученный файл:"
},
"rnprobe": {
"network_diagnostics": "Диагностика сети",


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────